package com.gaojinqi.base.core.sys.config;

import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static com.gaojinqi.base.core.sys.config.ConfigConst.SYSTEM_CONSTANT_PREFIX;

/**
 * 配置管理
 *
 * @author gaojinqi
 * @version 1.0
 * @since 2020年04月14日
 */
public class ConfigContextHolder {

    /**
     * 配置上下文
     */
    private static ConfigContext CONFIG_CONTEXT;

    /**
     * 返回配置上下文
     */
    public static ConfigContext getContext() {
        if (CONFIG_CONTEXT == null) {
            synchronized (ConfigContextHolder.class) {
                if (CONFIG_CONTEXT == null) {
                    return new DefaultMapConfigContext();
                }
            }
        }
        return CONFIG_CONTEXT;
    }

    /**
     * 设置配置上下文，可根据需要实现，默认以map存储
     *
     * @see ConfigContext 配置上下文接口
     * @see DefaultMapConfigContext 默认实现
     */
    public static void setContext(ConfigContext configContext) {
        CONFIG_CONTEXT = configContext;
    }

    /**
     * 配置上下文默认实现，以map存储
     */
    static class DefaultMapConfigContext implements ConfigContext {

        /**
         * 存储所有常量
         */
        private Map<String, Object> CONSTNTS_STORAGE = new ConcurrentHashMap<>();

        private DefaultMapConfigContext() {
        }

        @Override
        public Object get(String key) {
            if (StringUtils.isEmpty(key)) {
                return null;
            }
            return CONSTNTS_STORAGE.get(key);
        }

        @Override
        public Map<String, Object> getAll() {
            return CONSTNTS_STORAGE;
        }

        @Override
        public void put(String key, Object val) {
            if (StringUtils.isEmpty(key)) {
                return;
            }
            CONSTNTS_STORAGE.put(key, val);
        }

        @Override
        public void putAll(Map<String, Object> params) {
            if (CollectionUtils.isEmpty(params)) {
                return;
            }
            CONSTNTS_STORAGE.putAll(params);
        }

        @Override
        public void remove(String key) {
            if (StringUtils.isEmpty(key)) {
                return;
            }
            if (!key.startsWith(SYSTEM_CONSTANT_PREFIX)) {
                CONSTNTS_STORAGE.remove(key);
            }
        }

        @Override
        public void clear() {
            CONSTNTS_STORAGE.clear();
        }

    }


}
